package com.design_patterns.singleton;

import java.util.concurrent.atomic.AtomicReference;

/**
 * @author: 李德才
 * @description:
 * @create: 2020-11-15 18:22
 **/
public class CAS {

    /**
     * CAS ： compareAndSet
     * 基本原理
     * compareAndSet(当前值：oldValue,期望的值：expect,要设置的新值：newValue)
     * 如果传入的当前值和真实的当前值匹配，则直接进行操作
     * 当如的当前值和真实的当前值不匹配，则将传入的oldValue 修改为真正的当前值并再次调用本方法
     * 因为CAS使用的是CPU原语，不会出现某个时间点因为初始化等问题导致值不可用的情况
     */

    private static final AtomicReference<CAS> INSTANCE = new AtomicReference<CAS>();

    private CAS() {
    }

    public static CAS getInstance() {
        for (; ; ) {
            CAS instance = INSTANCE.get();
            if (instance != null) {
                return instance;
            }
            instance = new CAS();
            if (INSTANCE.compareAndSet(null, instance)) {
                return instance;
            }
        }
    }
}
